home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 051-075 / scopedisk68 / c2mod / dates.mod < prev    next >
Text File  |  1995-03-19  |  4KB  |  124 lines

  1. IMPLEMENTATION MODULE Dates;
  2.  
  3. (*
  4.    Routines for manipulating Dates.
  5.  
  6.    Revision history:
  7.      0.00
  8.  
  9.  
  10.    Copyright 1987 by:
  11.      Dale W. Thompson, 14500 Dallas Pkwy. #2091, Dallas, TX 75240
  12.  
  13.      This module and/or its procedures may be freely used by anyone,
  14.      but please acknowledge its use in any copyright notice of a
  15.      publicly distributed program.  Thank you.
  16.  
  17.      Please forward any comments, problems, or suggestions to me
  18.      at the address given, or to my CompuServe ID 75115,734.
  19. *)
  20.  
  21. FROM DOSLibrary IMPORT DateStampRec;
  22. FROM M2Conversions IMPORT ConvertCardinal;
  23. FROM Strings IMPORT Insert;
  24.  
  25. (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)
  26. PROCEDURE ParseDate( ds : DateStampRec; VAR date: DateString );
  27.    VAR
  28.        Weekday  : ARRAY [0..21] OF CHAR;
  29.        Month    : ARRAY [0..11], [0..3] OF CHAR;
  30.        Days     : ARRAY [0..11] OF CARDINAL;
  31.        LeapDays : ARRAY [0..11] OF CARDINAL;
  32.        year, month, day, weekday, hour, minute, second : CARDINAL;
  33.  
  34.    PROCEDURE Leap( year : CARDINAL ) : BOOLEAN;
  35.       BEGIN
  36.          RETURN ( ((year-1976) MOD 4) = 0 );
  37.       END (* PROCEDURE *) Leap;
  38.  
  39.    (* overlay CARDINAL number into date string *)
  40.    PROCEDURE ic( num, pos : CARDINAL );
  41.       VAR s : ARRAY [0..2] OF CHAR;
  42.       BEGIN
  43.          ConvertCardinal( num MOD 100, 2, s );
  44.          date[pos+1] := s[1];
  45.          IF (num MOD 100) > 9 THEN
  46.             date[pos] := s[0];
  47.          END;
  48.       END (* PROCEDURE *) ic;
  49.  
  50.    BEGIN
  51.       Weekday := "SunMonTueWedThuFriSat";
  52.       Month[0]  := "Jan";  Days[0]  := 31;  LeapDays[0]  := 31;
  53.       Month[1]  := "Feb";  Days[1]  := 28;  LeapDays[1]  := 29;
  54.       Month[2]  := "Mar";  Days[2]  := 31;  LeapDays[2]  := 31;
  55.       Month[3]  := "Apr";  Days[3]  := 30;  LeapDays[3]  := 30;
  56.       Month[4]  := "May";  Days[4]  := 31;  LeapDays[4]  := 31;
  57.       Month[5]  := "Jun";  Days[5]  := 30;  LeapDays[5]  := 30;
  58.       Month[6]  := "Jul";  Days[6]  := 31;  LeapDays[6]  := 31;
  59.       Month[7]  := "Aug";  Days[7]  := 31;  LeapDays[7]  := 31;
  60.       Month[8]  := "Sep";  Days[8]  := 30;  LeapDays[8]  := 30;
  61.       Month[9]  := "Oct";  Days[9]  := 31;  LeapDays[9]  := 31;
  62.       Month[10] := "Nov";  Days[10] := 30;  LeapDays[10] := 30;
  63.       Month[11] := "Dec";  Days[11] := 31;  LeapDays[11] := 31;
  64.  
  65.       day := CARDINAL( ds.dsDays );
  66.       weekday := day MOD 7;
  67.  
  68.       year := 1978;
  69.       LOOP
  70.          IF Leap( year ) THEN
  71.             IF day < 366 THEN
  72.                EXIT;
  73.             ELSE
  74.                DEC( day,366 );
  75.             END;
  76.          ELSE
  77.             IF day < 365 THEN
  78.                EXIT;
  79.             ELSE
  80.                DEC( day,365 );
  81.             END;
  82.          END;
  83.          INC( year );
  84.       END; (* LOOP *)
  85.  
  86.       INC( day );
  87.  
  88.       month := 0;
  89.       IF Leap( year ) THEN
  90.          WHILE day > LeapDays[month] DO
  91.             DEC( day, LeapDays[month] );
  92.             INC( month );
  93.          END;
  94.       ELSE
  95.          WHILE day > Days[month] DO
  96.             DEC( day, Days[month] );
  97.             INC( month );
  98.          END;
  99.       END;
  100.  
  101.       second := CARDINAL(ds.dsTick DIV 50) MOD 60;
  102.       minute := CARDINAL(ds.dsMinute);
  103.       hour   := minute DIV 60;
  104.       minute := minute MOD 60;
  105.  
  106.       date := "dow mmm-0d-yy 0h:0m:0s";
  107.       date[0] := Weekday[weekday*3];
  108.       date[1] := Weekday[weekday*3+1];
  109.       date[2] := Weekday[weekday*3+2];
  110.  
  111.       Insert( Month[month], date, 4 );
  112.  
  113.       ic( day,     8 );                 ic( year,   11 );
  114.       ic( hour,   14 );                 ic( minute, 17 );
  115.       ic( second, 20 );
  116.  
  117.    END (* PROCEDURE *) ParseDate;
  118.  
  119.  
  120.  
  121.  
  122. END (* IMPLEMENTATION MODULE *) Dates.
  123.  
  124.